"""
Vistas utilizadas 
"""
from pyramid.response import Response
from pyramid.renderers import render
import json
import re
from pyramid.httpexceptions import HTTPFound, HTTPNotFound
from pyramid.security import authenticated_userid
from alpha.modelos import DBSession
from alpha.modelos.models import Usuario
from alpha.modelos.models import Rol
from alpha.modelos.models import Proyecto
from alpha.modelos.models import Permiso
from alpha.modelos.models import AsociacionRolPermiso
from alpha.modelos.models import AsociacionUsuarioRol
import transaction



"""
Redirije la raiz a la vista main
"""
def redirect(request):
    return HTTPFound(location= request.route_url('main'))


"""
Vista main, los usuarios autenticados pueden ver el contenido 
"""
def main(request):
	logged_in= authenticated_userid(request)
	return dict( logged_in = logged_in, )


"""
Vista usuarios, seccion donde se administra las operaciones referentes a los usuarios
"""
def usuarios(request):
	logged_in= authenticated_userid(request)
	return dict( logged_in = logged_in, )


"""
Vista roles, seccion donde se administra las operaciones referentes a los roles
"""
def roles(request):
	logged_in= authenticated_userid(request)
	return dict( logged_in = logged_in, )


"""
Vista roles, seccion donde se administra las operaciones referentes a los roles
"""
def proyectos(request):
	logged_in= authenticated_userid(request)
	return dict( logged_in = logged_in, )


def asignarRol(request):
	session= DBSession()
	post_data= request.POST
	output= json.dumps({'success': False})
	if 'submit' in post_data:
		rolNombre= request.params['roles']
		idUsuario= int( request.params['id_usuario'])
		rol= session.query(Rol).filter_by(nombre= rolNombre).first() #selecciona el rol solicitado
		usuario= session.query(Usuario).filter_by(id= idUsuario).first() # selecciona el usuario indicado
		if (rol != None) and (usuario != None):
			aso= AsociacionUsuarioRol() # crea la asociacion, para muchos a muchos
			aso.rol= rol
			aso.left_id= usuario.id # este era el error anterior, faltaba esta asignacion
			usuario.asociacion.append(aso)# anhade la ascociacion (que contiene al rol) al usuario
			session.add(usuario)
			output= json.dumps({'success': True})
	return Response(output)   
 
 
def crearUsuarios(request):
	post_data= request.POST
	output= json.dumps({'success': False})
	if 'submit' in post_data:
		nombreUsuario= post_data['nombreUsuario']
		password1= post_data['password1']
		nombre= post_data['nombre']
		apellido= post_data['apellido']
		telefono= post_data['telefono']
		if telefono == "":
			telefono= 0
		nroDocumento= post_data['nroDocumento']
		if nroDocumento == "":
			nroDocumento= 0
		mail= post_data['email']
		transaction.begin()
		session= DBSession()
		usuario= Usuario(nombreUsuario, password1, nombre, apellido, telefono, nroDocumento, mail)
		session.add(usuario)
		transaction.commit()
		output= json.dumps({'success': True})
	return Response(output) 


"""  funcion elminar usuarios """
def eliminarUsuarios(request):
	post_data= request.POST
	if 'submit' in post_data:
		session= DBSession()
		idUsuario= int(request.params['id'])
		usuario= session.query(Usuario).filter_by( id= idUsuario).first() 
		output= json.dumps({'success': False})
		""" comprueba si el usuario existe en el sistema """
		if usuario != None:
			""" esta condicion comprueba si el usuario tiene roles
			asociados al mismo y los elimina uno a uno mediante el for """
			if usuario.asociacion != None:
				for roles in usuario.asociacion:
					session.delete(roles)
			session.delete(usuario)
			output= json.dumps({'success': True})
	return Response(output) 


def modificarUsuarios(request):
	post_data= request.POST
	if 'submit' in post_data:
		session= DBSession()
		idUsuario= int(request.params['id'])         
		usuario= session.query(Usuario).filter_by( id= idUsuario).first()
		output= json.dumps({'success': False})
		if usuario != None:
			usuario.setNombreUsuario(request.params['nombreUsuario'])
			usuario.setNombre(request.params['nombre'])
			usuario.setApellido( request.params['apellido'])
			usuario.setTelefono(request.params['telefono'])
			usuario.setNroDocumento(request.params['nroDocumento'])
			usuario.setMail( request.params['email'])
			session.add(usuario)
			output= json.dumps({'success': True})
	return Response(output)


""" Funcion que lista los usuarios registrados en el sistema """
def listarUsuarios(request):
	session = DBSession()
	lista= []
	for instance in session.query(Usuario).order_by(Usuario.nombre): 
		var= dict(id= instance.id, nombreUsuario=instance.nombreUsuario, nombre= instance.nombre, apellido= instance.apellido, 
		telefono=instance.telefono, nroDocumento=instance.nroDocumento, email= instance.mail, fecha = instance.fechaCreacion.strftime("%d/%m/%y %H:%M:%S"))
		lista.append(var)
	output = json.dumps({'data':lista})
	return Response(output)


def crearRol(request):
	post_data= request.POST
	if 'submit' in post_data:
		nombreRol= post_data['nombreRol']
		descripcion= post_data['descripcion']
		transaction.begin()
		session= DBSession()
		rol= Rol(nombreRol, descripcion)
		session.add(rol)
		transaction.commit()
		output= json.dumps({'success': True})
	return Response(output) 


def eliminarRol(request):
	post_data= request.POST
	if 'submit' in post_data:
		session= DBSession()
		idRol= int(request.params['id'])
		rol= session.query(Rol).filter_by(id= idRol).first()
		output= json.dumps({'success': False})
		if rol != None:
			session.delete(rol)
			output= json.dumps({'success': True})
	return Response(output) 


def modificarRol(request):
	post_data = request.POST
	output = json.dumps({'success': False})
	if 'submit' in post_data:
		session= DBSession()
		idRol= int(request.params['id'])
		rol= session.query(Rol).filter_by(id= idRol).first()
		if rol != None:
			rol.setNombre(request.params['nombreRol'])
			rol.setDescripcion(request.params['descripcion'])
			session.add(rol)
			output= json.dumps({'success': True})
	return Response(output)


def listarRoles(request):
	session= DBSession()
	lista= []
	for instance in session.query(Rol).order_by(Rol.nombre): 
		var= dict(id=instance.id, nombreRol=instance.getNombre(), descripcion=instance.getDescripcion(), fecha = instance.fechaCreacion.strftime("%d/%m/%y %H:%M:%S"))
		lista.append(var)
	output= json.dumps({'data':lista})
	return Response(output)


def crearProyecto(request):
	post_data= request.POST
	output= json.dumps({'success': False})
	if 'submit' in post_data:
		nombre= post_data['nombre']
		descripcion= post_data['descripcion']
		nroFases= post_data['nroFases']
		transaction.begin()
		if int(nroFases) > 0 :
			session= DBSession()
			proyecto= Proyecto(nombre, descripcion, nroFases)
			session.add(proyecto)
			output= json.dumps({'success': True})
		transaction.commit()
	return Response(output) 


def eliminarProyecto(request):
	post_data= request.POST
	if 'submit' in post_data:
		session= DBSession()
		idProyecto= int(request.params['id'])
		proyecto= session.query(Proyecto).filter_by(id= idProyecto).first()
		output= json.dumps({'success': False})
		if proyecto != None:
			session.delete(proyecto)
			output= json.dumps({'success': True})
	return Response(output) 


def modificarProyecto(request):
	post_data= request.POST
	if 'submit' in post_data:
		session= DBSession()
		idProyecto= int(request.params['id'])
		proyecto= session.query(Proyecto).filter_by(id= idProyecto).first()
		output= json.dumps({'success': False})
		if proyecto != None:
			nombreModificado= False
			descripcionModificado= False
			nroFasesModificado= False
			if proyecto.getNombre() != request.params['nombre']:
				proyecto.setNombre(request.params['nombre'])
				nombreModificado= True
			if proyecto.getDescripcion() != request.params['descripcion']:
				proyecto.setDescripcion(request.params['descripcion'])
				descripcionModificado= True
			if proyecto.getEstado() == 'No iniciado' and int(request.params['nroFases']) > 0:
				proyecto.setNroFases(request.params['nroFases'])
				nroFasesModificado= True
			session.add(proyecto)
		if  nombreModificado or descripcionModificado or nroFasesModificado:
			output= json.dumps({'success': True})
	return Response(output)


def listarProyectos(request):
	session = DBSession()
	lista= []
	for instance in session.query(Proyecto).order_by(Proyecto.nombre): 
		var= dict(id= instance.id, nombre=instance.getNombre(), descripcion=instance.getDescripcion(), 
		nroFases=instance.getNroFases() ,fecha = instance.fechaCreacion.strftime("%d/%m/%y %H:%M:%S"), estado = instance.getEstado())
		lista.append(var)
	output = json.dumps({'data':lista})
	return Response(output)


def iniciarProyecto(request):
	session= DBSession()
	proyecto= session.query(Proyecto).filter_by(id= request.params['id']).first()
	output= json.dumps({'success': False})
	if proyecto != None: 
		if proyecto.getEstado() == 'No iniciado':
			proyecto.setEstado('Iniciado')
			session.add(proyecto)
			output= json.dumps({'success': True})
	return Response(output)


def terminarProyecto(request):
	session= DBSession()
	proyecto= session.query(Proyecto).filter_by(id= request.params['id']).first()
	output= json.dumps({'success': False})
	if proyecto != None: 
		if proyecto.getEstado() == 'Iniciado':
			proyecto.setEstado('Terminado')
			session.add(proyecto)
			output= json.dumps({'success': True})
	return Response(output)
